'use strict';

const BaseController = require("../base");
const SysMenuDto = require("../../dto/sys-menu.dto");
class SysMenuController extends BaseController {
    // 查询所有菜单树
    async tree() {
        try {
            //获取到菜单按sort排序的数据,其实这个菜单排序并不重要谁先后,因为在前端还会进行路由匹配然后按照前端的排序顺序进行生成菜单,
            //这里数据库先给主菜单一个null值,以后可以修改一下顺序,还是不能控制页面的展示
            const res = await this.service.system.sysMenu.tree();
            if (!res.success) throw res.msg;

            //进行深拷贝和转化为树操作
            const _menus = this.ctx.helper.deepCopy(res.data);
            // console.log(_menus)
            const menus = this.ctx.helper.translateDataToTree(_menus, 0);
            // console.log(menus)

            //将子菜单进行排序,从大到小进行排序
            menus.map(menu => {
                menu.children = menu.children.sort((a, b) => a.sort - b.sort);
            })


            await this.success(menus)
        } catch (err) {
            await this.error(err);
        }
    }

    /**
     * @description 创建菜单
     * @param {SysMenuDto.createDto} 参数
     */
    async create() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysMenuDto.createDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //前往service层进行创建菜单
            const res = await this.service.system.sysMenu.create(verifytRes.params);
            if (!res.success) throw res.msg;

            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
     * @description 编辑
     * @param {SysMenuDto.editDto} 参数
     */
    async edit() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysMenuDto.editDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //获取到菜单的id
            const id = verifytRes.params.id;
            delete verifytRes.params.id;

            //前往业务层进行编辑菜单
            const res = await this.service.system.sysMenu.edit(id, verifytRes.params);
            if (!res.success) throw res.msg;

            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
    * @description 删除
    * @param {SysMenuDto.delDto} 参数
    */
    async del() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysMenuDto.delDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //直接删除,不进行软件删除
            const res = await this.service.system.sysMenu.del(verifytRes.params.id);

            if (!res.success) throw res.msg;
            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
     * @description 获取角色绑定的菜单ID
     * @param {roleId} 角色ID
     */
    async getMenuIdByRole() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams({
                roleId: {
                    required: true,
                    comment: "角色ID",
                }
            });
            if (!verifytRes.success) throw verifytRes.msg;
            console.log('请求参数', verifytRes.params)

            //前往业务层进行获取到对应的菜单和用户ID
            const res = await this.service.system.sysMenu.getMenuIdByRole(verifytRes.params.roleId);
            if (!res.success) throw res.msg;
            await this.success(res.data);
        } catch (err) {
            await this.error(err);
        }
    }
}

module.exports = SysMenuController;
